#ifndef __USART_H
#define __USART_H

#ifdef __cplusplus
extern "C"
{
#endif

#include "stdio.h"
#include "sys.h"
    

#define USART_REC_LEN 200                 //定义最大接收字节数 200
#define EN_USART1_RX 1                    //使能（1）/禁止（0）串口1接收
   extern u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
   extern u16 USART_RX_STA;               //接收状态标记
   //如果想串口中断接收，请不要注释以下宏定义
   void uart_init(u32 bound);
   void USART1_Send_Byte(unsigned char byte) ;//串口发送一个字节
#define UART4_MAX_RECV_LEN 470 //最大接收缓存字节数  ，一条指令47个字节，470个字节最大缓存10条指令
#define UART4_MAX_SEND_LEN 600 //最大发送缓存字节数

   extern u8 UART4_RX_BUF[UART4_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN个字节.
   extern u8 UART4_TX_BUF[UART4_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节

   extern struct UartTime Uart4Time; 

    
#define  QueueMax           50  
#define  QueueCacheMax      470

    typedef struct
    {
      u8  head_1;  /*包头0x0d*/
      u8  head_2;  /*包头0x0a*/
      double body;  /*命令 */
      u8  tail_1;  /*包尾0x0d*/
      u8  tail_2;  /*包尾0x0a*/
      u8  now_status;
      u8  init_status;
      /* 数组数据数量           */
    } Frame;

   typedef struct{
      Frame   frame;
      u8  DataBumber ;
      u8  FrameLength;
      u8  NowData;
      u8  Temporary_Receive[50];
      u8 (*UartCRC)(u8);         //指向串口校验的函数指针
   }UartRecv;
    
   typedef struct{
      u8  ProceseeReceiveQueue;
      u8  ReceiveQueue ;
      u8  FrameLength;
      u8  Data[QueueMax] ;
      u8  DataCache[QueueCacheMax];
   }Queue  ;
   
   extern  Queue  ImuUart4  ;
   extern  Queue  Uart5Queue;
   extern  UartRecv  Uart5Event;
   void Queue_Extract(Queue* queue);      //从接收缓存中提取一帧数据，并更新数组 
   void ClearQueue(Queue *queue);         //清零进程数组
   u8 ImuJudgeCrc(void);                  //判断Imu串口CRC
   int UartJudegCrc(UartRecv *Recv);      //判断CRC
   
   u8 HandleUart(UartRecv UartEvent, int (*handle)(UartRecv *), Queue UartQueue);
   void uart2_init(u32 bound);                                           //串口2初始化
   void uart4_init(u32 bound);                                           //串口4初始化
   void uart5_init(u32 bound); 
   
   void UART4_Send_Array(unsigned char send_array[], unsigned char num); //两个参数 一是数组(的数据) 二是数组长度1-255
   void UART4_Send_Byte(unsigned char byte);                             //串口发送一个字节
   void u4_printf(char *fmt, ...);
   void UART5_Send_Array(unsigned char send_array[], unsigned char num);

#ifdef __cplusplus
}
#endif

#endif
